﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Windows.Forms;
using EntitiesAndMappings.Entities;
using ProyectoActivos.Const;
using ProyectoActivos.Daos;
using ProyectoActivos.Util;
using ProyectoActivos.Validate;
namespace ProyectoActivos.Forms.Mantenimiento
{
    public partial class FrmActualizarArticulo : Form, IValidateForm
    {
        public Boolean CerroSinAccion { get; set; }
        private AppSettingsReader reader = new AppSettingsReader();
        private String rutaBaseArchivoImagen;
        private Boolean _valido;
        private Articulo articulo;
        private OpenFileDialog fDialog;

        public FrmActualizarArticulo(Articulo articulo)
        {
            InitializeComponent();
            CerroSinAccion = true;
            pbxImagenArticulo.SizeMode = PictureBoxSizeMode.StretchImage;
            this.articulo = articulo;
            rutaBaseArchivoImagen = ((string)(reader.GetValue("RaizRutaImagenes", typeof(string)))).ToLower();
        }

        private void btnRutaDeArchivoImagen_Click(object sender, EventArgs e)
        {

            if (System.IO.Directory.Exists(rutaBaseArchivoImagen))
            {
                String rutaArchivoImagen;
                fDialog = new OpenFileDialog();
                fDialog.Title = "Open Image Files";
                fDialog.Filter = "Archivos JPEG|*.jpg|Archivos GIF|*.gif|Archivos Bitmap|*.bmp";
                fDialog.AddExtension = true;
                fDialog.CheckFileExists = true;
                fDialog.CheckPathExists = true;
                fDialog.InitialDirectory = rutaBaseArchivoImagen;
                fDialog.RestoreDirectory = false;
                // fDialog.FileOk += new CancelEventHandler(fDialog_FileOk);

                if (fDialog.ShowDialog() == DialogResult.OK)
                {
                    if (ChequearRutaArchivo(fDialog.FileName.ToString()))
                    {
                        rutaArchivoImagen = fDialog.FileName.ToString();
                        pbxImagenArticulo.ImageLocation = rutaArchivoImagen;
                        txtSoloNombreDeArchivoImagen.Text = System.IO.Path.GetFileName(rutaArchivoImagen);
                    }
                    else
                    {
                        MessageBox.Show("Ruta de archivo inválida. Elija un archivo de la carpeta inicial especificada");
                    }
                }
            }
            else
            {
                MessageBox.Show("La ruta para imágenes configurada para la aplicación (" + rutaBaseArchivoImagen + ") no existe");

            }

        }

        private bool ChequearRutaArchivo(String nombreArchivo)
        {
            String ruta = System.IO.Path.GetDirectoryName(nombreArchivo).ToLower();

            if (ruta.CompareTo(rutaBaseArchivoImagen) == 0)
            {
                return true;
            }

            return false;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            CerroSinAccion = false;

            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertComboBoxSelected(cmbFamilia, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbSubFamilia, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtCodigo, 15, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtDescripcion, 75, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbMarca, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtModelo, 40, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtSerie, 40, errorProvider, this);

            FormsAssert.AssertComboBoxSelected(cmbTipoMantenimiento, errorProvider, this);
            FormsAssert.AssertTextBoxOnlyNumbers(txtFrecuenciaMantenimiento, errorProvider, this);
            FormsAssert.AssertTextBoxOnlyNumbers(txtStockMinimo, errorProvider, this);

            FormsAssert.AssertTextBoxOnlyNumbers(txtStockMinimo, errorProvider, this);
            FormsAssert.AssertComboBoxSelected(cmbUnidadMedida, errorProvider, this);

            ActionExecutor.Execute(this, delegate
            {
                var articuloDAO = new ArticuloDAO();

                //int idArticuloExistenteConMismoCodigo = articuloDAO.Buscar()

                //if(articulo.Id != 0)
                //{
                    
                //}
                //else
                //{
                    
                //}

                articulo.Codigo = txtCodigo.Text;
                articulo.SubFamilia = (SubFamilia)cmbSubFamilia.SelectedItem;
                articulo.Descripcion = txtDescripcion.Text.Trim();
                articulo.Marca = (Marca)cmbMarca.SelectedItem;
                articulo.Modelo = txtModelo.Text.Trim();
                articulo.Serie = txtSerie.Text.Trim();
                articulo.TipoMantenimiento = (TipoMantenimiento)cmbTipoMantenimiento.SelectedItem;
                articulo.FrecuenciaMantenimiento = int.Parse(txtFrecuenciaMantenimiento.Text.Trim());
                articulo.StockMinimo = int.Parse(txtStockMinimo.Text.Trim());
                articulo.UnidadMedida = (UnidadMedida)cmbUnidadMedida.SelectedItem;
                articulo.Observaciones = txtObservaciones.Text.Trim();

                if (txtPartes.Text.Trim().CompareTo(string.Empty) != 0)
                {
                    articulo.Partes = true;
                    articulo.PartesTexto = txtPartes.Text.Trim();
                }

                if (txtConsumibles.Text.Trim().CompareTo(string.Empty) != 0)
                {
                    articulo.Consumible = true;
                    articulo.ConsumibleTexto = txtConsumibles.Text.Trim();
                }

                articulo.RutaArchivoImagen = txtSoloNombreDeArchivoImagen.Text;

                if (articulo.Estado == null)
                {
                    articulo.Estado = Estado.Activo;
                }

                articuloDAO.Update(articulo);

                Close();
            });

        }

        public void Invalid()
        {
            _valido = false;
        }

        public Boolean IsValid()
        {
            return _valido;
        }

        private void FrmActualizarArticulo_Load(object sender, EventArgs e)
        {
            _valido = true;

            IList<Familia> listadoFamilia;
            IList<Marca> listadoMarca;
            IList<TipoMantenimiento> listadoTipoMantenimiento;
            IList<UnidadMedida> listadoUnidadMedida;

            ActionExecutor.Execute(this, delegate
            {
                var familiaDAO = new EntidadGenericaDAO<Familia>();
                listadoFamilia = familiaDAO.ListarActivos();
                cmbFamilia.DataSource = listadoFamilia;
                cmbFamilia.SelectedItem = null;


                //var listadoSubFamilia = subFamiliaDAO.ListarActivos();
                //cmbSubFamilia.DataSource = listadoSubFamilia;
                //cmbFamilia.SelectedItem = null;

                var marcaDAO = new EntidadGenericaDAO<Marca>();
                listadoMarca = marcaDAO.ListarActivos();
                cmbMarca.DataSource = listadoMarca;
                cmbMarca.SelectedItem = null;

                var tipoMantenimientoDAO = new EntidadGenericaDAO<TipoMantenimiento>();
                listadoTipoMantenimiento = tipoMantenimientoDAO.ListarActivos();
                cmbTipoMantenimiento.DataSource = listadoTipoMantenimiento;
                cmbTipoMantenimiento.SelectedItem = null;


                var unidadMedidaDAO = new EntidadGenericaDAO<UnidadMedida>();
                listadoUnidadMedida = unidadMedidaDAO.ListarActivos();
                cmbUnidadMedida.DataSource = listadoUnidadMedida;
                cmbUnidadMedida.SelectedItem = null;


                // cmbFamilia.SelectedIndex = GetIndiceTipoDocumento(listado);
            });

            if (articulo.Id != 0)
            {
                _valido = true;
                ActionExecutor.Execute(this, delegate
                {
                    var subFamiliaDAO = new SubFamiliaDAO();
                    Familia familia = subFamiliaDAO.ObtenerFamilia(articulo.SubFamilia);
                    cmbFamilia.SelectedIndex = ComboUtils.GetIndice(cmbFamilia, familia.Id);
                    cmbSubFamilia.SelectedIndex = ComboUtils.GetIndice(cmbSubFamilia, articulo.SubFamilia.Id);
                    cmbMarca.SelectedIndex = ComboUtils.GetIndice(cmbMarca, articulo.Marca.Id);
                    cmbTipoMantenimiento.SelectedIndex = ComboUtils.GetIndice(cmbTipoMantenimiento, articulo.TipoMantenimiento.Id);
                    cmbUnidadMedida.SelectedIndex = ComboUtils.GetIndice(cmbUnidadMedida, articulo.UnidadMedida.Id);

                    txtCodigo.Text = articulo.Codigo;
                    txtDescripcion.Text = articulo.Descripcion;
                    txtModelo.Text = articulo.Modelo;
                    txtSerie.Text = articulo.Serie;
                    txtFrecuenciaMantenimiento.Text = articulo.FrecuenciaMantenimiento.ToString();
                    txtStockMinimo.Text = articulo.StockMinimo.ToString();
                    txtObservaciones.Text = articulo.Observaciones;
                    txtPartes.Text = articulo.PartesTexto;
                    txtConsumibles.Text = articulo.ConsumibleTexto;
                    txtSoloNombreDeArchivoImagen.Text = articulo.RutaArchivoImagen;
                    pbxImagenArticulo.ImageLocation = rutaBaseArchivoImagen + "\\" + articulo.RutaArchivoImagen;
                });
            }
        }

        private void cmbFamilia_SelectedIndexChanged(object sender, EventArgs e)
        {


            if (cmbFamilia.SelectedItem != null)
            {
                var subFamiliaDAO = new SubFamiliaDAO();
                cmbSubFamilia.DataSource = subFamiliaDAO.ListarActivosPorFamilia(((Familia)cmbFamilia.SelectedItem).Id);
                cmbSubFamilia.SelectedItem = null;
            }
            else
            {
                cmbSubFamilia.DataSource = null;
            }
            txtCodigo.Text = String.Empty;


        }

        private void cmbSubFamilia_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbSubFamilia.SelectedItem != null)
            {
                txtCodigo.Text = ((Familia)cmbFamilia.SelectedItem).Codigo + ((SubFamilia)cmbSubFamilia.SelectedItem).Codigo;
            }

        }

    }
}
